Release Notes For BASIC11 Version 1.55 From the programmers viewpoint, version 1.55 of BASIC11 has changed very little. Three new commands were added that will be described later in this document. The majority of the changes made to BASIC11 allow it be easily used in a hardware environment other than Motorola's M68HC11EVB. To 'Customize' BASIC11 for a particular hardware environment, two areas of the interpreter need to be modified. I/O Routines: In addition to the I/O vector table that is located at $FFA0, all of the I/O routines required by BASIC11 to run in an HC11 EVB, were moved to the end of the interpreter. The routines begin at address $FF00 and end at $FF93 (see listing). BASIC11 performs all of its I/O through the routines INBYTE and OUTBYTE. INBYTE expects a single character to be returned in the A- accumulator. The OUTBYTE routine is entered with a single character contained in the A-accumulator. DO NOT CHANGE OR MOVE THE INBYTE AND OUTBYTE ROUTINES!!! The routines that perform the actual I/O functions by communicating with the hardware in a system are called by INBYTE and OUTBYTE through the I/O vector table. The I/O vector table consists of 16 entries. The first eight entries may be used for input type devices (INPUT #0...INPUT#7). The last eight may be used for output type devices (PRINT #0... PRINT #7). Device #0 (both input and output) is reserved for use as the system console and should not be used for other purposes. However, this does not mean that the system console must consist of a terminal. It could easily consist of an LCD display and membrane keyboard. As shown in the listing, each entry in the I/O vector table consists of a two byte address. These addresses point to the routines that communicate with the actual hardware to perform I/O functions on a character by character basis. Studying the listing should serve as a guide in writing a 'device driver' for any type of I/O hardware. Environment Variables: The environment variable table, located at $FFC0, consists of eight entries. These allow BASIC11 to determine a number of characteristics about the hardware environment it is operating in. Each entry is discussed below describing its use or function. 7137 FFC0 org $ffc0 7138 FFC0 C000 RAMStart fdb $c000 starting address of system RAM. 7139 FFC2 2000 RAMSize fdb $2000 size of BASIC11 RAM Buffer. 7140 FFC4 6000 EEStart fdb $6000 starting address of program storage EEPROM 7141 FFC6 2000 EESize fdb $2000 size of the program storage EEPROM 7142 FFC8 1000 IOBase fdb $1000 Base Address of the I/O Registers 7143 FFCA F424 TimeVal fdb 62500 value used for generating 'Time' Interrupt 7144 FFCC FF25 UserInit fdb IODevInit Used to initialize console/other hardware. 7145 FFCE 4000 DFLOPADR fdb $4000 Address of flip-flop used to connect the 7146 HC11 SCI to the host port connector. RAMStart The RAMStart entry consists of a two byte address that must point to an area of RAM that BASIC11 may use to store its program and/or variables. This RAM may be located anywhere in the memory map above $0100. ALL PAGE 0 ADDRESSES ($00 - $FF) ARE RESERVED FOR USE BY BASIC11!!! RAMSize The RAMSize entry consists of a 16-bit unsigned integer that tells BASIC11 how much RAM is available for its program and/or variables. A minimum suggested size for the RAM is approximately 8K bytes. EEStart The EEStart entry consists of a two byte address that must point to an area of memory that BASIC11 may use to store its program and variables when an ESAVE command is executed. This area of memory may consist of EEPROM, as detailed in the BASIC11 manual, or even battery backed RAM. EESize The EESize entry consists of a 16-bit unsigned integer that tells BASIC11 how much non-volatile memory is available for its program and/or variables. The volatile memory should be approximately the same size as BASIC11's RAM during program development. IOBase When an MC68HC11 comes out of reset, all of the I/O and control registers for it's on chip peripherals are placed in the memory map starting at address $1000. Since this address may interfere with other resources in a system, the I/O and control registers may be relocated to any 4K boundary within the memory map. TimeVal BASIC11 maintains an internal 'clock' that is incremented at a rate that is determined partially by the 16-bit unsigned number stored in these two bytes. A value of 62500 ($F424) will cause the 'clock' to be incremented once per second if the MC68HC11 is running at a 2.0 MHz E-clock (8.0 MHz crystal) rate. NOTE: When using the 'clock' in conjunction with BASIC11's ONTIME function, making the number too small may cause BASIC11 to spend most of its time servicing the ONTIME interrupt routine and not executing the main portion of the BASIC program. If an ONTIME interrupt routine requires a long time to execute, making the number too small may cause BASIC11 to become 'stuck' in the interrupt routine. UserInit The UserInit entry consists of a two byte address that points to a subroutine used to initialize any hardware or devices in the system. The subroutine is called after all of BASIC11's internal initialization is finished. As a minimum, the subroutine should initialize any hardware associated with the console I/O devices. The subroutine need not preserve any of the HC11's registers except the stack pointer. DFLOPADR If BASIC11 is being used with an MC68HC11EVB Rev 'B' or later this entry should be left at address $4000. It allows the HC11's SCI port to be connected to the DB-25 connector that is marked 'HOST'. If BASIC11 is being used in any other hardware environment, this entry should be set to $FFFF. A Configuration Example The following example shows how BASIC11 may be configured for use with a typical system. Resource Location Use -------- -------- --- Volatile RAM $0000 - $7FFF Program & Variable storage EEPROM $8000 - $BFFF ESAVE Program & Variable storage In addition, the internal 'clock' must have a resolution of 0.1 seconds. Since the memory map between $C000 and $DFFF is currently unused, the HC11's internal control and I/O registers will be placed at $C000. org $ffc0 RAMStart fdb $0100 starting address of system RAM. ; Remember, $00-$FF is reserved! RAMSize fdb $7F00 size of BASIC11 RAM Buffer. EEStart fdb $8000 starting address of program storage EEPROM EESize fdb $4000 size of the program storage EEPROM IOBase fdb $C000 Base Address of the I/O Registers TimeVal fdb 6250 value used for generating 'Time' Interrupt UserInit fdb IODevInit Used to initialize console/other hardware. DFLOPADR fdb $FFFF Address of flip-flop used to connect the HC11 SCI * to the host port connector. New Commands: The following new commands were added to version 1.55: FREE FREE The FREE command may be used to Display the amount of RAM memory that is currently available for BASIC11 program statements and variables. The FREE command may only be used while BASIC11 is in the command mode (i.e. it may not be used in a program statement). SLEEP SLEEP 700 SLEEP The SLEEP statement allows the MC68HC11 to be put into the 'Stop Mode' which is its lowest power consumption mode. In the 'Stop Mode', all clocks, including the internal oscillator, are stopped and all internal processing is halted. Recovery from the SLEEP statement may be accomplished by either a processor RESET or an XIRQ interrupt. When an XIRQ interrupt is used, BASIC11 will continue execution with the next BASIC program statement. When a hardware RESET is used to exit the sleep mode, the action taken by BASIC11 will depend on two factors. If the 'Auto Start' flag has been set with the AUTOST command, the BASIC program stored in external EEPROM/EPROM will automatically be executed. If the 'Auto Start' flag has not been set, BASIC11 will return to the command mode. RTIME RTIME 10 RTIME When assigning a value to the TIME system variable (see page 14 of the BASIC11 manual), BASIC11 will update the value of the TIME variable asynchronously in relation to interrupts generated by output compare one (OC1). The RTIME statement will reset the entire system time keeping function. The RTIME statement may be used to synchronize the system time keeping function to some external event. Note: To maintain accuracy of the system time keeping function, the RTIME statement should NOT be used within an ONTIME interrupt routine. IOPKG -- Micro Dialects, Inc. uASM-HC11 Assembler Mon, Sep 24, 1990 1:03 PM -- Page 2 6982 * 6983 * 6984 FED2 OUTBYTE EQU * 6985 FED2 7C001E INC PRINTPOS INCREMENT THE CURRENT PRINT POSITION. 6986 FED5 37 PSHB SAVE THE B-REG. 6987 FED6 3C PSHX SAVE THE X-REG. 6988 FED7 CE00B4 LDX #OUTABLE POINT TO THE OUTPUT VECTOR TABLE. 6989 FEDA D637 OUTBYTE1 LDAB DEVNUM GET THE CURRENT DEVICE NUMBER. 6990 FEDC 58 ASLB MULT BY 2. 6991 FEDD 3A ABX POINT TO THE ADDRESS OF THE OUTPUT ROUTINE. 6992 FEDE EE00 LDX 0,X GET THE ADDRESS. HAS THE VECTOR BEEN INITALIZED? 6993 FEE0 2608 BNE OUTBYTE2 YES. GO OUTPUT THE CHARACTER. 6994 FEE2 7F0037 CLR DEVNUM NO. RESET TO DEVICE #0. 6995 FEE5 8631 LDAA #UNINIERR GO REPORT AN UNINITALIZED I/O VECTOR ERROR. 6996 FEE7 7EEAEF JMP RPTRERR 6997 FEEA AD00 OUTBYTE2 JSR 0,X GO OUTPUT THE CHARACTER. 6998 FEEC 38 PULX RESTORE X. 6999 FEED 33 PULB RESTORE B. 7000 FEEE 39 RTS RETURN. 7001 * 7002 FEEF INBYTE EQU * 7003 FEEF 37 PSHB SAVE THE B-REG. 7004 FEF0 3C PSHX SAVE THE X-REG. 7005 FEF1 CE00A4 LDX #INTABLE POINT TO THE INPUT VECTOR TABLE. 7006 FEF4 20E4 BRA OUTBYTE1 GO USE THE SAME CODE AS OUTBYTE. 7007 * 7008 * 7009 0000 if *>$FF00 7011 endif 7012 * 7013 * 7014 FF00 ORG $FF00 7015 * 7016 * 7017 FF00 8D0D ACIAIN BSR ACIAINNE GO GET CHARACTER FROM ACIA, NO ECHO. 7018 * NOW, FALL THROUGH TO ACIAOUT TO ECHO CHARACTER. 7019 * 7020 * 7021 FF02 36 ACIAOUT PSHA SAVE THE CHARACTER TO OUTPUT. 7022 FF03 B69800 ACIAOUT1 LDAA ACIAST GET THE ACIA STATUS. 7023 FF06 8502 BITA #$02 IS THE XMIT DATA REGISTER EMPTY? 7024 FF08 27F9 BEQ ACIAOUT1 NO. WAIT TILL IT IS. 7025 FF0A 32 PULA YES. GET BYTE TO SEND. 7026 FF0B B79801 STAA ACIADT SEND IT. 7027 FF0E 39 RTS RETURN. 7028 * 7029 * 7030 * 7031 * 7032 * 7033 * 7034 FF0F B69800 ACIAINNE LDAA ACIAST GET THE ACIA STATUS. 7035 FF12 8501 BITA #$01 HAS A CHARACTER BEEN RECIEVED? 7036 FF14 27F9 BEQ ACIAINNE NO. WAIT TILL WE HAVE ONE. 7037 FF16 B69801 LDAA ACIADT YES. GET THE CHARACTER. 7038 FF19 39 RTS RETURN. 7039 * 7040 FF1A ACIASTAT EQU * 7041 FF1A 36 PSHA SAVE THE A-REG. 7042 FF1B B69800 LDAA ACIAST GET THE ACIA STATUS. 7043 FF1E 8501 BITA #$01 CHECK FOR A CHARACTER. 7044 FF20 32 PULA RESTORE A. 7045 FF21 39 RTS RETURN. 7046 * 7047 * IOPKG -- Micro Dialects, Inc. uASM-HC11 Assembler Mon, Sep 24, 1990 1:03 PM -- Page 3 7048 FF22 SCIIN EQU * 7049 FF22 3C PSHX Save the index register. 7050 FF23 DE61 LDX IOBaseV 7051 FF25 A62E SCIIN1 LDAA SCSR,X GET SCI STATUS. 7052 FF27 8420 ANDA #$20 HAS A CHARACTER BEEN RECIEVED? 7053 FF29 27FA BEQ SCIIN1 NO. WAIT FOR CHARACTER TO BE RECIEVED. 7054 FF2B A62F LDAA SCDR,X GET THE CHARACTER. 7055 FF2D 38 PULX Restore X. 7056 FF2E 39 RTS RETURN. 7057 * 7058 * 7059 FF2F SCIOUT EQU * 7060 FF2F 3C PSHX Save the index register. 7061 FF30 DE61 LDX IOBaseV 7062 FF32 36 PSHA SAVE THE CHARACTER TO SEND. 7063 FF33 A62E SCIOUT1 LDAA SCSR,X GET THE SCI STATUS. 7064 FF35 8580 BITA #$80 HAS THE LAST CHARACTER BEEN SHIFTED OUT? 7065 FF37 27FA BEQ SCIOUT1 NO. WAIT TILL IT HAS. 7066 FF39 32 PULA RESTORE CHARACTER TO SEND. 7067 FF3A A72F STAA SCDR,X SEND THE CHARACTER. 7068 FF3C 38 PULX Restore X. 7069 FF3D 39 RTS RETURN. 7070 * 7071 * 7072 FF3E SCISTAT EQU * 7073 FF3E 3C PSHX Save the index register. 7074 FF3F DE61 LDX IOBaseV 7075 FF41 36 PSHA SAVE THE A-REG. 7076 FF42 A62E LDAA SCSR,X GET THE SCI STATUS. 7077 FF44 8520 BITA #$20 CHECK TO SEE IF A CHARACTER HAS BEEN RECIEVED. 7078 FF46 32 PULA RESTORE STATUS. 7079 FF47 38 PULX Restore X. 7080 FF48 39 RTS RETURN W/ STATUS. 7081 * 7082 * 7083 FF49 IODevInit: 7084 FF49 8D2A BSR InitACIA 7085 FF4B 8D11 BSR InitSCI 7086 FF4D 867E LDAA #JMPOP 7087 FF4F 979E STAA CONSTAT INITIALIZE THE CONSOLE STATUS VECTOR. 7088 FF51 97A1 STAA INCONNE INITIALIZE THE "INPUT FROM CONSOLE NO ECHO VECT. 7089 FF53 CCFF1A LDD #ACIASTAT CONSOLE IS INITIALLY THE ACIA. 7090 FF56 DD9F STD CONSTAT+1 7091 FF58 CCFF0F LDD #ACIAINNE GET BYTE FROM ACIA, DON'T ECHO IT. 7092 FF5B DDA2 STD INCONNE+1 7093 FF5D 39 RTS 7094 * 7095 * 7096 FF5E INITSCI EQU * 7097 FF5E 3C PSHX Save the index register. 7098 FF5F DE61 LDX IOBaseV 7099 FF61 8630 LDAA #$30 SET BAUD RATE TO 9600. 7100 FF63 A72B STAA BAUD,X 7101 FF65 6F2C CLR SCCR1,X SET FOR 8 BIT OPERATION, DISABLE WAKEUP. 7102 FF67 860C LDAA #$0C ENABLE THE TRANSMITER & RECEIVER. 7103 FF69 A72D STAA SCCR2,X 7104 FF6B 8611 LDAA #$11 GET THE XON CHARACTER (CONTROL-Q). 7105 FF6D 9743 STAA XONCH INITALIZE THE XON REGISTER. 7106 FF6F 8613 LDAA #$13 GET THE XOFF CHARACTER (CONTROL-S). 7107 FF71 9744 STAA XOFFCH INITALIZE THE XOFF CHARACTER. 7108 FF73 38 PULX 7109 FF74 39 RTS RETURN. 7110 * 7111 * 7112 FF75 8613 INITACIA LDAA #$13 VALUE TO RESET THE ACIA. IOPKG -- Micro Dialects, Inc. uASM-HC11 Assembler Mon, Sep 24, 1990 1:03 PM -- Page 4 7113 FF77 B79800 STAA ACIAST RESET IT. 7114 FF7A 8656 LDAA #$56 SET /64, RTS=HI, 8-DATA/1 STOP 7115 FF7C B79800 STAA ACIAST 7116 FF7F 39 RTS RETURN. 7117 * 7118 * 7119 * 7120 FF80 PROUT EQU * SEND A CHARACTER TO THE PRINTER. 7121 FF80 8DBC BSR SCISTAT WAS AN "X-OFF" RECIEVED? 7122 FF82 270E BEQ PROUT1 NO. GO SEND THE CHARACTER. 7123 FF84 36 PSHA SAVE THE CHARACTER TO SEND. 7124 FF85 8D9B BSR SCIIN YES. GO RESET THE SCI RECEIVER STATUS. 7125 FF87 9144 CMPA XOFFCH WAS IT AN XOFF? 7126 FF89 2606 BNE PROUT2 NO. SO GO SEND THE CHARACTER. 7127 FF8B 8D95 PROUT3 BSR SCIIN GO WAIT FOR AN "X-ON" CHARACTER. 7128 FF8D 9143 CMPA XONCH IS IT AN X-ON CHARACTER? 7129 FF8F 26FA BNE PROUT3 NO. GO WAIT FOR AN X-ON CHARACTER. 7130 FF91 32 PROUT2 PULA GET THE CHARACTER TO SEND. 7131 FF92 209B PROUT1 BRA SCIOUT SEND THE CHARACTER TO THE PRINTER & RETURN. 7132 * 7133 * 7134 Include 'VECTORS.Asm' 7135 ttl Config/Reset/Interrupt Vectors Config/Reset/Interrupt Vectors -- Micro Dialects, Inc. uASM-HC11 Assembler Mon, Sep 24, 1990 1:03 PM -- Page 5 7137 0000 if *>$ffa0 7139 endif 7140 * 7141 * 7142 * 7143 FFA0 org $ffa0 7144 FFA0 FF00 IOVects fdb ACIAIN 7145 FFA2 FF22 fdb SCIIN 7146 FFA4 0000 fdb 0 7147 FFA6 0000 fdb 0 7148 FFA8 0000 fdb 0 7149 FFAA 0000 fdb 0 7150 FFAC 0000 fdb 0 7151 FFAE 0000 fdb 0 7152 FFB0 FF02 fdb ACIAOUT 7153 FFB2 FF80 fdb PROUT 7154 FFB4 0000 fdb 0 7155 FFB6 0000 fdb 0 7156 FFB8 0000 fdb 0 7157 FFBA 0000 fdb 0 7158 FFBC 0000 fdb 0 7159 FFBE 0000 fdb 0 7160 * 7161 * 7162 FFC0 org $ffc0 7163 FFC0 C000 RAMStart fdb $c000 starting address of system RAM. 7164 FFC2 2000 RAMSize fdb $2000 size of BASIC11 RAM Buffer. 7165 FFC4 6000 EEStart fdb $6000 starting address of program storage EEPROM 7166 FFC6 2000 EESize fdb $2000 size of the program storage EEPROM 7167 FFC8 1000 IOBase fdb $1000 Base Address of the I/O Registers 7168 FFCA F424 TimeVal fdb 62500 value used for generating 'Time' Interrupt 7169 FFCC FF49 UserInit fdb IODevInit Used to initialize console/other hardware. 7170 FFCE 4000 DFLOPADR fdb $4000 ; Address of flip-flop used to connect the HC11 SCI 7171 ; to the host port connector. 7172 ; 7173 ; 7174 7175 FFD6 ORG ROMBEG+ROMSIZE-(21*2) START OF VECTOR TABLE. 7176 FFD6 00C4 FDB SCISS SCI SERIAL SYSTEM 7177 FFD8 00C7 FDB SPITC SPI TRANSFER COMPLETE 7178 FFDA 00CA FDB PACCIE PULSE ACCUMULATOR INPUT EDGE 7179 FFDC 00CD FDB PACCOVF PULSE ACCUMULATOR OVERFLOW 7180 FFDE 00D0 FDB TIMEROVF TIMER OVERFLOW 7181 FFE0 00D3 FDB TOC5 TIMER OUTPUT COMPARE 5 7182 FFE2 00D6 FDB TOC4 TIMER OUTPUT COMPARE 4 7183 FFE4 00D9 FDB TOC3 TIMER OUTPUT COMPARE 3 7184 FFE6 00DC FDB TOC2 TIMER OUTPUT COMPARE 2 7185 FFE8 00DF FDB TOC1 TIMER OUTPUT COMPARE 1 7186 FFEA 00E2 FDB TIC3 TIMER INPUT CAPTURE 3 7187 FFEC 00E5 FDB TIC2 TIMER INPUT CAPTURE 2 7188 FFEE 00E8 FDB TIC1 TIMER INPUT CAPTURE 1 7189 FFF0 00EB FDB REALTIMI REAL TIME INTERRUPT 7190 FFF2 00EE FDB IRQI IRQ INTERRUPT 7191 FFF4 00F1 FDB XIRQ XIRQ INTERRUPT 7192 FFF6 00F4 FDB SWII SOFTWARE INTERRUPT 7193 FFF8 00F7 FDB ILLOP ILLEGAL OPCODE TRAP 7194 FFFA 00FA FDB COP WATCH DOG FAIL 7195 FFFC 00FD FDB CMF CLOCK MONITOR FAIL 7196 FFFE ED77 FDB POWERUP RESET 7197 * 7198 * 7199 *